package com.mjh.config.handler;

import com.mjh.model.CodeEnum;
import com.mjh.model.R;
import com.mjh.utils.ResponseUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

import java.io.IOException;
@Component
public class AppAccessDeniedHandler implements AccessDeniedHandler {
    /**
     * 处理访问被拒绝的情况
     * 当用户没有足够权限访问某个资源时，此方法将被调用
     *
     * @param request 请求对象，包含用户请求的信息
     * @param response 响应对象，用于向用户发送响应
     * @param accessDeniedException 访问被拒绝的异常信息
     *
     * 该方法重写自父类，用于自定义处理访问被拒绝的情况
     * 它通过向响应中写入特定的错误信息，告知客户端请求被拒绝的原因
     *
     * 为什么这么做：自定义错误响应，使得错误处理更加友好和清晰
     * 为什么此时做：当用户尝试访问没有权限的资源时，需要给予明确的响应
     * 怎么做：使用ResponseUtils工具类向响应中写入错误信息，指示请求被拒绝
     *
     * 特别说明：此处抛出IOException和ServletException，是因为处理过程中可能会发生I/O操作或Servlet相关的操作错误
     */
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        ResponseUtils.write(response, R.FAIL(CodeEnum.FORBIDDEN+accessDeniedException.getMessage()));
    }
}
